package cn.com.inossem.activity;

import uk.co.senab.photoview.PhotoView;
import uk.co.senab.photoview.PhotoViewAttacher;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.animation.DecelerateInterpolator;
import android.widget.GridView;
import cn.com.inossem.base.RequestActivity;
import cn.com.inossem.config.WSConfig;
import cn.com.inossem.utils.ActivityStackControlUtil;
import cn.com.inossem.utils.AsyncImageLoader;
import cn.com.inossem.utils.AsyncImageLoader.ImageCallback;
import cn.com.inossem.utils.Utils;
import cn.com.inossem.utils.view.HackyViewPager;

import com.foxykeep.datadroid.requestmanager.Request;

/**
 * 
 * 检索向导
 * 
 * <p>
 * detailed comment
 * 
 * @author szc 2015-8-24
 * @see
 * @since 1.0
 */
public class ImagesActivity extends RequestActivity {

	private Animator mCurrentAnimator;

	private int mShortAnimationDuration = 300;

	LayoutInflater inflater;
	private LayoutInflater mInflater;
	public GridView gridview;

	float startScale;
	HackyViewPager viewPager;
	Rect startBounds;
	float startScaleFinal;

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// setContentView(R.layout.main_tab_layout);
		initView();

	}

	@Override
	public void onDestroy() {
		ActivityStackControlUtil.remove(this);
		super.onDestroy();
	}

	private void initView() {
	}

	private void zoomImageFromThumb(View thumbView, int position) {
		// If there's an animation in progress, cancel it immediately and
		// proceed with this one.
		if (mCurrentAnimator != null) {
			mCurrentAnimator.cancel();
		}

		gridview = Utils.gridview;
		String picList = getIntent().getStringExtra("picList");
		String[] pic = { "" };

		if (picList.contains(",")) {
			pic = picList.split(",");
		} else {
			pic[0] = picList;
		}

		viewPager = (HackyViewPager) this.findViewById(R.id.expanded_image);
		viewPager.setAdapter(new SamplePagerAdapter(pic, this));
		viewPager.setCurrentItem(position);
		// teViewPager.setOffscreenPageLimit(1);

		// Calculate the starting and ending bounds for the zoomed-in image.
		// This step
		// involves lots of math. Yay, math.
		startBounds = new Rect();
		final Rect finalBounds = new Rect();
		final Point globalOffset = new Point();

		// The start bounds are the global visible rectangle of the thumbnail,
		// and the
		// final bounds are the global visible rectangle of the container view.
		// Also
		// set the container view's offset as the origin for the bounds, since
		// that's
		// the origin for the positioning animation properties (X, Y).
		thumbView.getGlobalVisibleRect(startBounds);
		Log.i(position + "", thumbView.toString());
		Log.i(position + "", "(" + startBounds.left + "," + startBounds.top
				+ "," + startBounds.right + "," + startBounds.bottom + ")");
		this.findViewById(R.id.container).getGlobalVisibleRect(finalBounds,
				globalOffset);
		startBounds.offset(-globalOffset.x, -globalOffset.y);
		finalBounds.offset(-globalOffset.x, -globalOffset.y);

		// Adjust the start bounds to be the same aspect ratio as the final
		// bounds using the
		// "center crop" technique. This prevents undesirable stretching during
		// the animation.
		// Also calculate the start scaling factor (the end scaling factor is
		// always 1.0).

		if ((float) finalBounds.width() / finalBounds.height() > (float) startBounds
				.width() / startBounds.height()) {
			// Extend start bounds horizontally
			startScale = (float) startBounds.height() / finalBounds.height();
			float startWidth = startScale * finalBounds.width();
			float deltaWidth = (startWidth - startBounds.width()) / 2;
			startBounds.left -= deltaWidth;
			startBounds.right += deltaWidth;
		} else {
			// Extend start bounds vertically
			startScale = (float) startBounds.width() / finalBounds.width();
			float startHeight = startScale * finalBounds.height();
			float deltaHeight = (startHeight - startBounds.height()) / 2;
			startBounds.top -= deltaHeight;
			startBounds.bottom += deltaHeight;
		}

		// show the zoomed-in view. When the animation
		// begins,
		// it will position the zoomed-in view in the place of the thumbnail.
		viewPager.setVisibility(View.VISIBLE);
		// Set the pivot point for SCALE_X and SCALE_Y transformations to the
		// top-left corner of
		// the zoomed-in view (the default is the center of the view).

		// 设置动画开始的SCALE_X 和SCALE_Y变化的左上角原点,如果不设置的话默认从View的center开始
		// teViewPager.setPivotX(0f);
		// teViewPager.setPivotY(0f);
		//
		AnimatorSet animSet = new AnimatorSet();
		animSet.setDuration(1);
		animSet.play(ObjectAnimator.ofFloat(viewPager, "pivotX", 0f))
				.with(ObjectAnimator.ofFloat(viewPager, "pivotY", 0f))
				.with(ObjectAnimator.ofFloat(viewPager, "alpha", 1.0f));
		animSet.start();

		// Construct and run the parallel animation of the four translation and
		// scale properties
		// (X, Y, SCALE_X, and SCALE_Y).
		AnimatorSet set = new AnimatorSet();
		ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(gridview,
				"alpha", 1.0f, 0.f);
		ObjectAnimator animatorX = ObjectAnimator.ofFloat(viewPager, "x",
				startBounds.left, finalBounds.left);
		ObjectAnimator animatorY = ObjectAnimator.ofFloat(viewPager, "y",
				startBounds.top, finalBounds.top);
		ObjectAnimator animatorScaleX = ObjectAnimator.ofFloat(viewPager,
				"scaleX", startScale, 1f);
		ObjectAnimator animatorScaleY = ObjectAnimator.ofFloat(viewPager,
				"scaleY", startScale, 1f);

		set.play(alphaAnimator).with(animatorX).with(animatorY)
				.with(animatorScaleX).with(animatorScaleY);
		set.setDuration(mShortAnimationDuration);
		set.setInterpolator(new DecelerateInterpolator());
		set.addListener(new AnimatorListenerAdapter() {

			public void onAnimationEnd(Animator animation) {
				mCurrentAnimator = null;
			}

			public void onAnimationCancel(Animator animation) {
				mCurrentAnimator = null;
			}
		});
		set.start();
		mCurrentAnimator = set;

		// Upon clicking the zoomed-in image, it should zoom back down to the
		// original bounds
		// and show the thumbnail instead of the expanded image.
		startScaleFinal = startScale;

	}

	public boolean getScaleFinalBounds(int position) {
		GridView gridView = gridview;
		View childView = gridView.getChildAt(position
				- gridView.getFirstVisiblePosition());

		startBounds = new Rect();
		final Rect finalBounds = new Rect();
		final Point globalOffset = new Point();

		try {

			if (childView == null) {
				Log.i("info", "null");
			} else {
				childView.getGlobalVisibleRect(startBounds);
			}

			Log.i(position + ">>", "(" + startBounds.left + ","
					+ startBounds.top + "," + startBounds.right + ","
					+ startBounds.bottom + ")");
		} catch (Exception e) {

			Log.i("info", "出异常:" + e.getMessage());
			return false;
		}
		this.findViewById(R.id.container).getGlobalVisibleRect(finalBounds,
				globalOffset);
		startBounds.offset(-globalOffset.x, -globalOffset.y);
		finalBounds.offset(-globalOffset.x, -globalOffset.y);

		if ((float) finalBounds.width() / finalBounds.height() > (float) startBounds
				.width() / startBounds.height()) {
			// Extend start bounds horizontally
			startScale = (float) startBounds.height() / finalBounds.height();
			float startWidth = startScale * finalBounds.width();
			float deltaWidth = (startWidth - startBounds.width()) / 2;
			startBounds.left -= deltaWidth;
			startBounds.right += deltaWidth;
		} else {
			// Extend start bounds vertically
			startScale = (float) startBounds.width() / finalBounds.width();
			float startHeight = startScale * finalBounds.height();
			float deltaHeight = (startHeight - startBounds.height()) / 2;
			startBounds.top -= deltaHeight;
			startBounds.bottom += deltaHeight;
		}
		startScaleFinal = startScale;
		return true;
	}

	class SamplePagerAdapter extends PagerAdapter {

		private String[] sDrawables;
		private Context mContext;

		public SamplePagerAdapter(String[] imgIds, Context context) {
			this.sDrawables = imgIds;
			this.mContext = context;
		}

		@Override
		public int getCount() {
			return sDrawables.length;
		}

		@Override
		public View instantiateItem(ViewGroup container, final int position) {
			final PhotoView photoView = new PhotoView(container.getContext());
			// photoView.setImageResource(sDrawables[position]);

			AsyncImageLoader asyncImageLoader = new AsyncImageLoader(mContext);
			Drawable drawable = asyncImageLoader
					.loadDrawable(
							WSConfig.IMAGE_URL
									+ sDrawables[position].replace("s_", ""),
							new ImageCallback() {
								@Override
								public void imageLoaded(Drawable imageDrawable,
										String imageUrl) {
									if (imageDrawable != null) {
										// photoView
										// .setBackgroundDrawable(imageDrawable);
										if (photoView != null)
											photoView
													.setImageDrawable(imageDrawable);
									}
								}
							});
			if (drawable != null) {
				// photoView.setBackgroundDrawable(drawable);
				if (photoView != null)
					photoView.setImageDrawable(drawable);
			}

			// Now just add PhotoView to ViewPager and return it
			container.addView(photoView, LayoutParams.MATCH_PARENT,
					LayoutParams.MATCH_PARENT);
			photoView
					.setOnPhotoTapListener(new PhotoViewAttacher.OnPhotoTapListener() {
						public void onPhotoTap(View paramAnonymousView,
								float paramAnonymousFloat1,
								float paramAnonymousFloat2) {
							if (mCurrentAnimator != null) {
								mCurrentAnimator.cancel();
							}

							photoView.clearZoom();

							boolean scaleResult = getScaleFinalBounds(position);
							// Animate the four positioning/sizing properties in
							// parallel,
							// back to their
							// original values.
							AnimatorSet as = new AnimatorSet();
							ObjectAnimator containAlphaAnimator = ObjectAnimator
									.ofFloat(gridview, "alpha", 0.f, 1.0f);
							if (scaleResult) {
								ObjectAnimator animatorX = ObjectAnimator
										.ofFloat(viewPager, "x",
												startBounds.left);
								ObjectAnimator animatorY = ObjectAnimator
										.ofFloat(viewPager, "y",
												startBounds.top);
								ObjectAnimator animatorScaleX = ObjectAnimator
										.ofFloat(viewPager, "scaleX",
												startScaleFinal);
								ObjectAnimator animatorScaleY = ObjectAnimator
										.ofFloat(viewPager, "scaleY",
												startScaleFinal);

								as.play(containAlphaAnimator).with(animatorX)
										.with(animatorY).with(animatorScaleX)
										.with(animatorScaleY);
							} else {
								// the selected photoview is beyond the mobile
								// screen display
								// so it just fade out
								ObjectAnimator alphaAnimator = ObjectAnimator
										.ofFloat(viewPager, "alpha", 0.1f);
								as.play(alphaAnimator).with(
										containAlphaAnimator);
							}
							as.setDuration(mShortAnimationDuration);
							as.setInterpolator(new DecelerateInterpolator());
							as.addListener(new AnimatorListenerAdapter() {

								@Override
								public void onAnimationEnd(Animator animation) {
									viewPager.clearAnimation();
									viewPager.setVisibility(View.GONE);
									mCurrentAnimator = null;
								}

								@Override
								public void onAnimationCancel(Animator animation) {
									viewPager.clearAnimation();
									viewPager.setVisibility(View.GONE);
									mCurrentAnimator = null;
								}
							});
							as.start();
							mCurrentAnimator = as;

						}
					});

			return photoView;
		}

		@Override
		public void destroyItem(ViewGroup container, int position, Object object) {
			container.removeView((View) object);
		}

		@Override
		public boolean isViewFromObject(View view, Object object) {
			return view == object;
		}

	}

	@Override
	public Request getInitialRequest() {
		return null;

	}

	@Override
	public void onRequestSucess(Request request, Bundle bundle) {

	}

	@Override
	public void onRequestError(int exceptionType) {

	}

	public int getContentViewId() {
		return R.layout.imagespic_layout;

	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch (v.getId()) {
		case R.id.back:
			finish();
			break;

		default:
			break;
		}
	}

	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		switch (resultCode) { // resultCode为回传的标记，我在B中回传的是RESULT_OK
		case 1:
			setResult(1);
			finish();
		default:
			break;
		}
	}

}
